summaryrefslogtreecommitdiffstats
path: root/src/core/file_sys/fsa/fs_i_directory.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/file_sys/fsa/fs_i_directory.h')
-rw-r--r--src/core/file_sys/fsa/fs_i_directory.h20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/core/file_sys/fsa/fs_i_directory.h b/src/core/file_sys/fsa/fs_i_directory.h
index a4135efec..fc0407d01 100644
--- a/src/core/file_sys/fsa/fs_i_directory.h
+++ b/src/core/file_sys/fsa/fs_i_directory.h
@@ -16,14 +16,15 @@ namespace FileSys::Fsa {
class IDirectory {
public:
- IDirectory(VirtualDir backend_, OpenDirectoryMode mode) : backend(std::move(backend_)) {
+ explicit IDirectory(VirtualDir backend_, OpenDirectoryMode mode)
+ : backend(std::move(backend_)) {
// TODO(DarkLordZach): Verify that this is the correct behavior.
// Build entry index now to save time later.
if (True(mode & OpenDirectoryMode::Directory)) {
- BuildEntryIndex(entries, backend->GetSubdirectories(), DirectoryEntryType::Directory);
+ BuildEntryIndex(backend->GetSubdirectories(), DirectoryEntryType::Directory);
}
if (True(mode & OpenDirectoryMode::File)) {
- BuildEntryIndex(entries, backend->GetFiles(), DirectoryEntryType::File);
+ BuildEntryIndex(backend->GetFiles(), DirectoryEntryType::File);
}
}
virtual ~IDirectory() {}
@@ -45,28 +46,29 @@ public:
}
private:
- virtual Result DoRead(s64* out_count, DirectoryEntry* out_entries, s64 max_entries) {
+ Result DoRead(s64* out_count, DirectoryEntry* out_entries, s64 max_entries) {
const u64 actual_entries =
std::min(static_cast<u64>(max_entries), entries.size() - next_entry_index);
- auto* begin = reinterpret_cast<u8*>(entries.data() + next_entry_index);
+ const auto* begin = reinterpret_cast<u8*>(entries.data() + next_entry_index);
+ const auto* end = reinterpret_cast<u8*>(entries.data() + next_entry_index + actual_entries);
+ const auto range_size = static_cast<std::size_t>(std::distance(begin, end));
next_entry_index += actual_entries;
*out_count = actual_entries;
- out_entries = reinterpret_cast<DirectoryEntry*>(begin);
+ std::memcpy(out_entries, entries.data(), range_size);
R_SUCCEED();
}
- virtual Result DoGetEntryCount(s64* out) {
+ Result DoGetEntryCount(s64* out) {
*out = entries.size() - next_entry_index;
R_SUCCEED();
}
// TODO: Remove this when VFS is gone
template <typename T>
- void BuildEntryIndex(std::vector<DirectoryEntry>& entries, const std::vector<T>& new_data,
- DirectoryEntryType type) {
+ void BuildEntryIndex(const std::vector<T>& new_data, DirectoryEntryType type) {
entries.reserve(entries.size() + new_data.size());
for (const auto& new_entry : new_data) {